package com.lbd.base.service;

import org.springframework.data.domain.Page;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * Created by WangYajie on 2016/9/13.
 */
public interface BaseService<T> {
    /**
     * 根据id删除数据
     *
     * @param id id
     */
    void del(Serializable id);

    /**
     * 根据id数组删除数据
     *
     * @param id id数组
     */
    void del(Serializable id[]);

    /**
     * 删除对象
     *
     * @param t 对象
     */
    void del(T t);

    /**
     * 更新
     *
     * @param t
     */
    void update(T t);

    /**
     * 保存
     *
     * @param t
     */
    void save(T t);

    /**
     * 查询所有
     *
     * @return
     */
    List<T> findAll();

    /**
     * 根据id查询
     *
     * @param id id
     * @return
     */
    T findById(Serializable id);

    /**
     * 条件分页查询
     *
     * @param index
     * @param pageSize
     * @return
     */
    Page<T> findByPage(int index, int pageSize);

    /**
     * 使用JPA的动态接口，翻页带条件
     *
     * @param index
     * @param pageSize
     * @param t
     * @return
     */
    Page<T> findByPageConditionJpa(int index, int pageSize, T t);

    /**
     * { return new Specification<E>() {
     *
     * @param index    页码
     * @param pageSize 每页行数
     * @param t        对象
     * @return
     * @Override public Predicate toPredicate(Root<E> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {
     * <p>
     * <p>
     * List<Predicate> list = new ArrayList<>(); list.add(cb.like(root.get("className"), e.toString()));
     * Predicate[] predicates = new Predicate[list.size()]; predicates = list.toArray(predicates); return
     * cb.and(predicates); } };
     */

    Page<T> findByPageConditionJpql(int index, int pageSize, T t);

    /**
     * 分页查询
     *
     * @param index        页码
     * @param pageSize     每页行数
     * @param queryBuilder sql语句
     * @return
     */
    Page<T> findByPageConditionJpql(int index, int pageSize, QueryBuilder queryBuilder);

    /**
     * 分页查询
     *
     * @param t 对象
     * @return
     */
    List<T> findByConditionJpql(T t);

    /**
     * 构建jpql分页 s
     * <p>
     * <p>
     * { StringBuilder jpqlBuilder = new StringBuilder("  from  EventLog t   ");
     * <p>
     * if (e != null) { if (StringUtils.isNotBlank(e.getClassName())) { jpqlBuilder.append(
     * " and  className like :className"); parameter.put("className",e.getClassName()); } } return
     * jpqlBuilder.toString().replaceFirst("and", "where"); }
     *
     * @param e
     * @param parameter
     * @return
     */
    /**
     * nativeQuery分页
     *
     * @param page      当前页码
     * @param rows      每页的行数
     * @param parameter 参数
     * @param nativeSql nativeSql 字符串
     * @return
     */
    Page findByPageNativeQuery(int page, int rows, Map<String, Object> parameter, String nativeSql);

    /**
     * nativesql返回Map
     *
     * @param parameter nativeSql 的参数
     * @param nativeSql nativeSql 字符串
     * @return
     */
    Map findMapByPageNativeQuery(Map<String, Object> parameter, String nativeSql);

}
